<?php
/**
 * Module:  Data
 * About:   Данные - контроллер
 * Author:  Vlad Andreev <php.vlad@gmail.com>
 **/

namespace Data;

class Controller extends \Control\ControllerAncestor {
    
    public $name;
    public $title;
    public $table;
    public $module;
    public $fields = array();
    public $fields_db;
    public $fields_str;
    
    public function __construct() {
        
        parent::__construct();
        
        $live = \Control\live::getInstance();
        $live->_theme_control = true;
        
        $this->repDataType = $this->em->getRepository('Data\Entities\DataType');
        $this->repDataField = $this->em->getRepository('Data\Entities\DataField');
        $this->repDataTemplate = $this->em->getRepository('Data\Entities\DataTemplate');
    }
    
    /*
     *  Actions
     */
    
    // Список типов данных
    public function listAction() {
        
        $form = new \Control\Forms;
        $form->setTitle('Типы данных');
        $form->setTemplate('list');
       
        $form->addHead(array(
            array(
                'width' => 1,
                'text '=> array(
                    'type'  => 'checkbox',
                    'id'    => 'all_check',
                    'action'=> 'all_check();',
                )
            ),
            array('width'=>1),
            array('width'=>500, 'align'=>'left', 'text'=>'Имя'),
            array('width'=>300, 'align'=>'left', 'text'=>'Идентификатор'),
            array('width'=>1),
            array('width'=>100)
        ));
        
        $rows = array();
        
        $data_types = $this->repDataType->findBy(
            array(),
            array('module' => 'ASC')
        );
        
        foreach ($data_types as $data_type) {
            $id         = $data_type->id;
            $data_name  = $data_type->name;
            $data_title = $data_type->title;
            
            $check = array(
                'type'  => 'checkbox',
                'id'    => $id,
                'class' => 'check_item',
                'style' => 'cursor:pointer',
            );
            
            $edit = array(
                'type'  => 'link_img_edit',
                'href'  => '#Data/edit/'. $id,
            );
            
            $delete = array(
                'type'  => 'link_img_delete',
                'action'=> "javascript: if (MsgOkCancel('Действительно удалить?')) { acDelete('DataType', '$id'); }",
            );
            
            $delete_table = array(
                'type'       => 'checkbox',
                'cell_style' => 'font-size:7pt;line-height:1.1',
                'id'         => 'data_delete_table_'. $id,
                'style'      => 'float:left',
                'label'      => 'удалить<br/>таблицу'
            );
            
            $title  = array(
                'type'  => 'link',
                'href'  => '#Data/listFields/'. $id,
                'text'  => $data_title,
            );
            
            $name   = array(
                'type'  => 'link',
                'href'  => '#Data/listFields/'. $id,
                'text'  => $data_name,
            );
            
            $rows[] = array($check, $edit, $title, $name, $delete, $delete_table);
        }
        
        $form->addRows($rows);
        
        $output = $form->render();
        
        return $output;
    }
    
    // Форма добавления типа данных
    public function addAction() {
        
        $data = new \Data\Data;
        $data->setName('DataType');
        $output = $data->addForm(array('title' => 'Добавить тип данных'));
        
        return $output;
    }
    
    // Форма редактирования типа данных
    public function editAction($id = null) {
        
        $dataType = new \Data\DataType;
        $item = $dataType->find(intval($id));
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Тип данных не найден');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Data/list">← Вернуться к списку типов данных</a>');
            
            return $form->render();
        }
        
        $data = new \Data\Data;
        $data->setName('DataType');
        $data->setData($item);
        
        $output = $data->editForm(array(
            'title' => 'Редактировать тип данных',
            'deleteQuestion' => 'Вы действительно хотите удалить этот тип данных?',
        ));
        
        return $output;
    }
    
    // Список полей типа данных
    public function listFieldsAction($dataTypeId = null) {
        
        $dataTypeId = intval($dataTypeId);
        $dataType = $this->repDataType->find($dataTypeId);
        
        if (!$dataType) {
            $form = new \Control\Forms;
            $form->setTitle('Тип данных не найден');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Data/list">← Вернуться к списку типов данных</a>');
            
            return $form->render();
        }
        
        $form = new \Control\Forms;
        $form->setTitle('Тип данных: '. $dataType->title .'. Поля:');
        $form->setTemplate('list');
        $form->addHead(array(
            array('width' => 30),
            array('align' => 'left', 'text' => 'Имя'),
            array('align' => 'left', 'text' => 'Идентификатор'),
            array('align' => 'left', 'text' => 'Тип'),
            array('width' => 30),
            array('width' => 30)
        ));
        
        $type_options = array();
        $field = $this->repDataField->findOneBy(array('name' => 'type', 'data_name' => 'DataField'));
        $field_options = explode(',', $field->options);
        foreach ($field_options as $option) {
            $option = explode('=', $option);
            $type_options[$option[0]] = $option[1];
        }
        
        $rows = array();
        
        $fields = $this->repDataField->findBy(array('data_name' => $dataType->name), array('num' => 'ASC'));
        foreach ($fields as $field) {
            $edit = array(
                'type'    => 'link_img_edit',
                'href'    => '#Data/editField/'. $field->id
            );
            
            $title = array(
                'type'    => 'textbox',
                'id'      => $dataType->name .'_title_'. $field->id,
                'value'   => $field->title
            );
            
            $name = array(
                'type'    => 'textbox',
                'id'      => $dataType->name .'_name_'. $field->id,
                'value'   => $field->name
            );
            
            $type = array(
                'type'    => 'select',
                'id'      => $dataType->name .'_type_'. $field->id,
                'value'   => $field->type,
                'options' => $type_options
            );
            
            $save = array(
                'type'    => 'link_img_save',
                'action'  => "data_field_edit('{$dataType->name}', '{$field->id}')"
            );
            
            $delete = array(
                'type'    => 'link_img_delete',
                'action'  => "javascript: if (MsgOkCancel('Вы действительно хотите удалить это поле?')) { acDelete('DataField', {$field->id}); }"
            );
            
            $rows[] = array($edit, $title, $name, $type, $save, $delete);
        }
        
        $name = array(
            'type'   => 'textbox',
            'id'     => 'Data_name'
        );
        
        $title = array(
            'type'   => 'textbox',
            'id'     => 'Data_title'
        );
        
        $type = array(
            'type'   => 'select',
            'id'     => 'Data_type',
            'options'=> $type_options
        );
        
        $add = array(
            'type'   => 'link_img_add',
            'action' => "data_field_add('{$dataType->name}')"
        );
        
        $rows[] = array('', $title, $name, $type, $add, '');
        
        $form->addRows($rows);
        
        $form->addFooter(array(
            'type'  => 'hidden',
            'id'    => 'Data_data_name',
            'value' => $dataType->name
        ));
        
        $form->addFooter(array(
            'type'  => 'hidden',
            'id'    => 'Data_active',
            'value' => '1'
        ));
        
        $form->addFooter(array(
            'type'  => 'hidden',
            'id'    => 'Data_module',
            'value' => $dataType->module
        ));
        
        $output = $form->render();
        
        return $output;
    }
    
    // Форма редактирования поля типа данных
    public function editFieldAction($id = null) {
        
        $id = intval($id);
        $item = $this->repDataField->find($id);
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Поле не найдено');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Data/list">← Вернуться к списку типов данных</a>');
            
            return $form->render();
        }
        
        $dataType = $this->repDataType->findOneByName($item->data_name);
        $module = $this->em->getRepository('\Modules\Entities\Module')->findOneByName($dataType->module);
        
        $form = new \Control\Forms;
        $form->setTitle('Редактировать поле типа данных.');
        $form->setTemplate('form');
        $form->setFormId('form-DataField-edit');
        $form->setFormAction('/Data/save/DataField/'. $id);
        
        $form->addHTML($module->title .' → '. $dataType->title .' → <strong>'. $item->title .'</strong>');
        
        $options = new \stdClass;
        $options->type          = 'textarea';
        $options->name          = 'options';
        $options->value         = $item->options;
        $options->attributes    = "rows='5' cols='30'";
        $options->caption       = 'Опции';
        
        $attributes = new \stdClass;
        $attributes->type       = 'textarea';
        $attributes->name       = 'attributes';
        $attributes->value      = $item->attributes;
        $attributes->attributes = "rows='5' cols='30'";
        $attributes->caption    = 'Аттрибуты';
        
        $form->addObject($options);
        $form->addObject($attributes);
        
        switch ($item->type) {
            
            case 'textarea': {
                $default_value = new \stdClass;
                $default_value->type        = 'textarea';
                $default_value->name        = 'default_value';
                $default_value->value       = $item->default_value;
                $default_value->attributes  = "rows='5' cols='30'";
                $default_value->caption     = 'Значение по умолчанию';
                
                $form->addObject($default_value);
                
                break;
            }
            case 'select': {
                $status = new \stdClass;
                $status->type       = 'select';
                $status->name       = 'status';
                $status->value      = $item->status;
                $status->options    = array('static' => 'статичный', 'db' => 'из базы');
                $status->caption    = 'Тип';
                
                $form->addObject($status);
                
                $default_value = new \stdClass;
                $default_value->type    = 'select';
                $default_value->name    = 'default_value';
                $default_value->value   = $item->default_value;
                $default_value->options = $item->options;
                $default_value->status  = $item->status;
                $default_value->caption = 'Значение по умолчанию';
                
                $form->addObject($default_value);
                
                break;
            }
            case 'checkbox_list': {
                $status = new \stdClass;
                $status->type    = 'select';
                $status->name    = 'status';
                $status->value   = $item->status;
                $status->options = array('static' => 'статичный', 'db' => 'из базы');
                $status->caption = 'Тип';
                
                $form->addObject($status);
                
                break;
            }
        }
        
        $form->addFooter(array(
            'type'    => 'button',
            'id'      => 'ok',
            'value'   => 'Готово',
            'action'  => "acFormSubmit('form-DataField-edit', 'listFields/". $dataType->id ."');"
        ));
        
        $form->addFooter(array(
            'type'    => 'button',
            'id'      => 'save',
            'value'   => 'Сохранить',
            'action'  => "acFormSubmit('form-DataField-edit');"
        ));
        
        $form->addFooter(array(
            'type'    => 'button',
            'id'      => 'cancel',
            'value'   => 'Отмена',
            'action'  => '#Data/listFields/'. $dataType->id
        ));
        
        $output = $form->render();
        
        return $output;
    }
    
    // Список шаблонов
    public function listTemplatesAction() {
        
        $conf = \Control\Core::conf();
        
        $form = new \Control\Forms;
        $form->setTitle('Типы данных. Шаблоны');
        $form->setTemplate('list');
        $form->addHead(array(
                        array('width'=>1),
                        array('width'=>500, 'align'=>'left', 'text'=>'Имя'),
                        array('width'=>300, 'align'=>'left', 'text'=>'Идентификатор'),
                        array('width'=>1)));
        
        $rows = array();
        
        $templates = $this->repDataTemplate->findBy(array(), array('name' => 'ASC'));
        foreach ($templates as $template) {
            $edit = array(
                'type'  => 'link_img_edit',
                'href'  => '#Data/editTemplate/'. $template->id
            );
            
            $delete = array(
                'type'  => 'link_img_delete',
                'action'=> "javascript: if (MsgOkCancel('Вы вействительно хотите удалить этот шаблон?')) { acDelete('DataTemplate', '". $template->id ."'); }"
            );
            
            $title = array(
                'type'  => 'link',
                'href'  => '#Data/editTemplate/'. $template->id,
                'text'  => $template->title
            );
            
            $name = array(
                'type'  => 'link',
                'href'  => '#Data/editTemplate/'. $template->id,
                'text'  => $template->name
            );
            
            $rows[] = array($edit, $title, $name, $delete);
        }
        
        $form->addRows($rows);
        $output = $form->render();
        
        return $output;
    }
    
    // Форма добавления шаблона
    public function addTemplateAction() {
        
        $data = new \Data\Data;
        $data->setName('DataTemplate');
        $output = $data->addForm(array('title' => 'Добавить шаблон'));
        
        return $output;
    }
    
    // Форма редактирования шаблона
    public function editTemplateAction($id) {
        
        $dataTemplate = new \Data\DataTemplate;
        $item = $dataTemplate->find(intval($id));
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Шаблон не найден');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Data/listTemplates">← Вернуться к списку шаблонов</a>');
            
            return $form->render();
        }
        
        $data = new \Data\Data;
        $data->setName('DataTemplate');
        $data->setData($item);
        
        $output = $data->editForm(array(
            'title' => 'Редактировать шаблон',
            'deleteQuestion' => 'Вы действительно хотите удалить этот шаблон?',
            'redirect' => 'listTemplates'
        ));
        
        return $output;
    }
    
    // Список опций
    public function optionsAction($page = null) {
        
        $conf = \Control\Core::conf();
        $live = \Control\live::getInstance();
        
        $json = array();
        $json[] = array('title'=>'Добавить тип данных', 'href'=>'#Data/add');
        
        $childs = array();
        $data_types = $this->repDataType->findBy(array());
        if (!empty($data_types)) {
            foreach ($data_types as $data_type) {
                $childs_right = array();
                $childs_right[] = array('type'=>'link_img_list', 'href'=>'#Data/listFields/'. $data_type->id);
                $childs_right[] = array('type'=>'link_img_edit', 'href'=>'#Data/edit/'. $data_type->id);
                
                $childs_bottom = array();
                $data_fields = $this->repDataField->findBy(array('data_name' => $data_type->name));
                if (!empty($data_fields)) {
                    foreach ($data_fields as $data_field) {
                        $childs_bottom[] = array(
                            'title' => $data_field->title,
                            'href'=>'#Data/editField/'. $data_field->id
                        );
                    }
                }
                
                $childs_spoiler = array(
                    'id'    => 'data_options_type_'. $data_type->id, 
                    'items' => $childs_bottom
                );
                
                $childs[] = array(
                    'name'            => $data_type->name,
                    'title'           => $data_type->title,
                    'action'          => "acSlideToggle('data_options_type_". $data_type->id ."')",
                    'childs_right'    => $childs_right,
                    'childs_spoiler'  => $childs_spoiler
                );
            }
        }
        
        $json[] = array('title'=>'Список данных', 'href'=>'#Data/list', 'childs'=>$childs);
        
        $json[] = array('title'=>'');
        
        $json[] = array('title'=>'Добавить шаблон', 'href'=>'#Data/addTemplate');
        
        $childs = array();
        $data_templates = $this->repDataTemplate->findAll();
        if (!empty($data_templates)) {
            foreach ($data_templates as $data_template) {
                $childs[] = array(
                    'name' => $data_template->name,
                    'title'=> (!empty($data_template->title)) ? $data_template->title : $data_template->name,
                    'href' => '#Data/editTemplate/'. $data_template->id
                );
            }
        }
        
        $json[] = array('title'=>'Список Шаблонов', 'href'=>'#Data/listTemplates', 'childs'=>$childs);
        // $json[] = array('title'=>'Настройки', 'href' => '#Data/settings' );
        
        $output = json_encode($json);
        
        return $output;
    }
    
    // Сохранить
    public function saveAction($entity, $id = null) {
        
        $id    = intval($id);
        $model = '\Data\\'. $entity;
        
        $data = new $model;
        $data->save($_POST, $id);
        
        return $this->statusOk();
    }
    
    // Удалить
    public function deleteAction($entity, $id) {
        
        $id    = intval($id);
        $model = '\Data\\'. $entity;
        
        $data = new $model;
        $data->delete($id);
        
        return $this->statusOk();
    }
    
    // Включить
    public function activateAction($entity, $id) {
        
        $id    = intval($id);
        $model = '\Data\\'. $entity;
        
        $data = new $model;
        $data->save(array('active' => 1), $id);
        
        return $this->statusOk();
    }
    
    // Выключить
    public function disableAction($entity, $id) {
        
        $id    = intval($id);
        $model = '\Data\\'. $entity;
        
        $data = new $model;
        $data->save(array('active' => 0), $id);
        
        return $this->statusOk();
    }
    
    /*
     *  Service methods
     */
    
    // Экранирование переменных
    public function quote_smart($value) {
        
        if (get_magic_quotes_gpc())
            $value = stripslashes($value);
        if (!is_numeric($value))
            $value = mysql_real_escape_string($value);
        
        $value = htmlspecialchars($value);
        
        return $value;
    }
}